#include "link_list.h"

// 单链表的创建
Link_list *init_link_list(void)
{
    // 1 创建 头节点的动态空间
    Link_list *list = (Link_list *)malloc(sizeof(Link_list));
    if (NULL == list)
    {
        printf("创建失败\n");
        return NULL;
    }

    list->next = NULL;

    return list;
}

// 单链表的遍历
void print_link_list(Link_list *list)
{
    Node *ptr = list->next;
    for (size_t i = 0; ptr != NULL; i++)
    {
        printf("姓名:%s 性别:%s 年龄:%d 成绩:%d 学号:%d\n",
               ptr->data.name, ptr->data.sex, ptr->data.age,
               ptr->data.sco, ptr->data.id);
        ptr = ptr->next;
    }
}

// 单链表的销毁
void free_link_list(Link_list **list)
{
    if (NULL == *list)
    {
        printf("链表 为 NULL\n");
        return;
    }

    // 1 销毁结点
    Node *ptr_1 = (*list)->next;
    Node *ptr_2 = ptr_1->next;
    for (size_t i = 0; ptr_1 != NULL; i++)
    {
        free(ptr_1);
        // if 判断  判断 ptr2 = NULL 的时候 我们如何处理
        ptr_1 = ptr_2;
        if (NULL != ptr_2)
        {
            ptr_2 = ptr_2->next;
        }
    }

    // 2 销毁头结点
    free(*list);
    *list = NULL;
}

// 单链表的尾插
void tail_insert_node(Link_list **list, Elenemt_data data)
{
    // 创建新节点
    Node *new_node = (Node *)malloc(sizeof(Node));
    new_node->data = data;
    new_node->next = NULL;

    // 如果链表为空，将新节点设置为头节点
    if ((*list)->next == NULL)
    {
        (*list)->next = new_node;
    }
    else
    {
        // 否则，遍历链表，找到最后一个节点
        Node *temp = (*list)->next;
        while (temp->next != NULL)
        {
            temp = temp->next;
        }
        // 将新节点添加到最后一个节点的后面
        temp->next = new_node;
    }
}

// 单链表的尾删
void tail_delete_node(Link_list **list)
{
    if (NULL == *list || NULL == (*list)->next)
    {
        printf("链表为空或只有一个节点\n");
        return;
    }

    // 1. 找到倒数第二个节点
    Node *ptr_1 = (*list)->next;
    Node *ptr_2 = ptr_1->next;
    while (ptr_2 != NULL && ptr_2->next != NULL)
    {
        ptr_1 = ptr_2;
        ptr_2 = ptr_2->next;
    }

    // 2. 删除最后一个节点
    free(ptr_2);
    ptr_1->next = NULL;
}